import axios from 'axios';
import { getToken, setToken, clearToken } from '@/utils/storage';
import { Toast } from 'antd-mobile';
import { hasToken } from './storage';
import history from './history';
import store from '@/store';
import { AuthLocationStateType } from '@/components/AuthRoute';
//19.10 无感刷新-使用refresh_token获取新的token
//19.11 权限控制-无感刷新-处理refresh_token过期的问题
//19.12.refresh_token过期的问题-优化-清除token

// 请求基地址
export const baseURL = 'http://geek.itheima.net';

// 创建 axios 实例
const http = axios.create({
  baseURL: baseURL,
  timeout: 5000,
});

// 请求拦截器
http.interceptors.request.use(
  function (config) {
    //获取token
    const { token } = getToken();
    if (config.headers && token) {
      //2,设置config
      config.headers.Authorization = `Bearer ${token}`;
    }
    return config;
  },
  function (error) {
    return Promise.reject(error);
  }
);

// 响应拦截器
http.interceptors.response.use(
  function (response) {
    return response.data;
  },
  async function (error) {
    console.dir(error);
    //情况1 , 网络问题
    if (!error.response) {
      Toast.show({ content: '网络有问题,请检查网络' });
      return Promise.reject(error);
    }
    //情况2 , 非401 问题
    if (error.response.status !== 401) {
      Toast.show({ content: error.response.data.message });
    } else {
      //19.10.1 判断是否还有refresh_token  登录后会返回 token 和 refresh_token
      const refresh_token = getToken().refresh_token;
      if (refresh_token) {
        //19.10.2 如果有refresh_token 发起刷新请求 去获取新的token
        try {
          //19.11.1 包含try catch 语句 捕获到错误  就重定向到登录页面
          const res = await axios({
            url: baseURL + '/v1_0/authorizations',
            method: 'put',
            headers: {
              Authorization: `Bearer ${refresh_token}`,
              'Content-Type': 'application/x-www-form-urlencoded',
            },
          });
          console.log('res.data.data', res.data.data.token);
          //19.10.5 实现无感刷新 保存token到redux以及缓存中
          const auth = { token: res.data.data.token, refresh_token };
          store.dispatch({
            type: 'user/saveAuth',
            payload: auth,
          });
          setToken(auth);

          //19.10.6 请求原来的请求 , error.config 就是报错前的信息
          return http(error.config);
        } catch (error) {
          //19.12.1 token已经完成失效
          //19.12.2 清掉redux中的auth
          store.dispatch({
            type: 'user/saveAuth',
            payload: {} as any,
          });
          //19.12.3 清掉缓存中的token
          clearToken();
          //19.11.2 处理refresh_token过期的逻辑
          history.push('/login', {
            from: history.location.pathname,
          } as AuthLocationStateType);
        }
      } else {
        //19.10.3 如果没有refresh_token 重定向到登录界面
        //19.11.3 🔔 记得回跳
        history.push('/login', {
          from: history.location.pathname,
        } as AuthLocationStateType);
      }

      //情况3, 401 问题 登录失败  提示用户的信息 让用户看的懂
      Toast.show({ content: '登录超时,请重新登录' });
    }
  }
);

// 导出 axios 实例
export default http;
